package com.example.bookkeepingelf.base.utils;

public class StringUtils {

    /**
     * 私有构造函数，防止实例化
     */
    private StringUtils() {
        throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
    }

    /**
     * 判断字符串是否为 null 或者空字符串（""）
     *
     * @param str 待检查的字符串
     * @return 如果字符串为 null 或者空字符串，则返回 true；否则返回 false
     */
    public static boolean isEmpty(String str) {
        return str == null || str.isEmpty();
    }

    /**
     * 判断字符串是否不为 null 并且非空字符串（""）
     *
     * @param str 待检查的字符串
     * @return 如果字符串不为 null 并且非空字符串，则返回 true；否则返回 false
     */
    public static boolean isNotEmpty(String str) {
        return !isEmpty(str);
    }

    /**
     * 判断字符串是否为 null 或者只包含空白字符
     *
     * @param str 待检查的字符串
     * @return 如果字符串为 null 或者只包含空白字符，则返回 true；否则返回 false
     */
    public static boolean isBlank(String str) {
        return str == null || str.trim().isEmpty();
    }

    /**
     * 判断字符串是否不为 null 并且不只包含空白字符
     *
     * @param str 待检查的字符串
     * @return 如果字符串不为 null 并且不只包含空白字符，则返回 true；否则返回 false
     */
    public static boolean isNotBlank(String str) {
        return !isBlank(str);
    }

    /**
     * 去除字符串两端的空白字符
     *
     * @param str 待处理的字符串
     * @return 去除两端空白字符后的字符串，如果输入为 null，则返回 null
     */
    public static String trim(String str) {
        return str == null ? null : str.trim();
    }

    /**
     * 如果字符串为 null 或者空字符串，则返回默认值
     *
     * @param str        待检查的字符串
     * @param defaultStr 默认值
     * @return 如果字符串为 null 或者空字符串，则返回默认值；否则返回原字符串
     */
    public static String defaultIfEmpty(String str, String defaultStr) {
        return isEmpty(str) ? defaultStr : str;
    }

    /**
     * 如果字符串为 null 或者只包含空白字符，则返回默认值
     *
     * @param str        待检查的字符串
     * @param defaultStr 默认值
     * @return 如果字符串为 null 或者只包含空白字符，则返回默认值；否则返回原字符串
     */
    public static String defaultIfBlank(String str, String defaultStr) {
        return isBlank(str) ? defaultStr : str;
    }

    /**
     * 将字符串转换为大写形式
     *
     * @param str 待转换的字符串
     * @return 转换后的字符串，如果输入为 null，则返回 null
     */
    public static String toUpperCase(String str) {
        return str == null ? null : str.toUpperCase();
    }

    /**
     * 将字符串转换为小写形式
     *
     * @param str 待转换的字符串
     * @return 转换后的字符串，如果输入为 null，则返回 null
     */
    public static String toLowerCase(String str) {
        return str == null ? null : str.toLowerCase();
    }

    /**
     * 检查字符串是否以指定前缀开头（忽略大小写）
     *
     * @param str    待检查的字符串
     * @param prefix 前缀
     * @return 如果字符串以指定前缀开头（忽略大小写），则返回 true；否则返回 false
     */
    public static boolean startsWithIgnoreCase(String str, String prefix) {
        if (str == null || prefix == null) {
            return false;
        }
        if (str.startsWith(prefix)) {
            return true;
        }
        int prefixLength = prefix.length();
        if (prefixLength > str.length()) {
            return false;
        }
        return str.regionMatches(true, 0, prefix, 0, prefixLength);
    }

    /**
     * 检查字符串是否以指定后缀结尾（忽略大小写）
     *
     * @param str    待检查的字符串
     * @param suffix 后缀
     * @return 如果字符串以指定后缀结尾（忽略大小写），则返回 true；否则返回 false
     */
    public static boolean endsWithIgnoreCase(String str, String suffix) {
        if (str == null || suffix == null) {
            return false;
        }
        if (str.endsWith(suffix)) {
            return true;
        }
        int suffixLength = suffix.length();
        if (suffixLength > str.length()) {
            return false;
        }
        return str.regionMatches(true, str.length() - suffixLength, suffix, 0, suffixLength);
    }
}